策略模式
定义
策略模式定义了算法家族并将它们封装起来,让他们之间可以互相替换,此模式让算法变化而不会影响到使用算法的客户
适用场景
商场经常会进行各式各样的促销活动,这就要求收银软件需要按照不同的促销方式来对顾客的最终费用进行计算,这里的促销方式其实就是各类打折算法,并且这些算法之间还可以互相替换而不影响到使用这些算法的客户端也就是前面说的收银软件。
结构图
代码示例
|
|
模板方法模式
定义
定义一个操作中的算法的骨架,而将一些不走延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
适用场景
模板方法通过把不变行为搬移到超类,去除子类中重复代码来体现它的优势。模板方法提供了一个很好的代码复用平台,因为有时候,我们会遇到由一系列步骤构成的过程需要执行。这些过程从高层次上看是相同,但有些步骤的实现可能不同。这时候,我们通常就应该要考虑用模板方法模式
结构图
代码示例
|
|
观察者模式
定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己
适用场景
当一个对象的改变需要同时改变其他对象的时候,且该对象并不知道具有有多少对象有待改变时,应该适用观察者模式
结构图
代码示例
|
|
迭代器模式
定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
适用场景
当需要对一个聚集对象里面的每个元素都进行遍历的时候就可以考虑适用迭代器模式
结构图
代码示例
|
|
责任链模式
定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
适用场景
当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它,这样使得接受者和发送者都没有对方明确的信息,且链中的对象自己也并不知道链的结构,职责链可简化对象的相互连接,他们仅需保持一个指向其后继者的引用,而不需保持他所有的候选接受者的引用
结构图
代码示例
|
|
命令模式
定义
将一个请求封装为一个对象,从而使你可用不用的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可测销的操作
适用场景
当需要将请求一个操作对象但并不需要知道如何执行这个操作对象时可以使用命令模式
优点
- 命令模式比较容易设置一个命令队列
- 可以对命令队列的相关操作进行日志记录
- 命令对象可以对命令调用指令进行过滤,可否决一部分调用请求
- 可以很容易的实现对请求的撤销和重做
- 实现了命令类与具体命令类的解耦,符合“开闭原则”
结构图
代码示例
|
|
备忘录模式
定义
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后可将该对象恢复到原先到保存的状态
适用场景
备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态
结构图
代码示例
|
|
状态模式
定义
当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了起来
适用场景
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
状态模式主要是为了相处庞大的条件分支语句,大的分支判断会使得他们难以修改和扩展。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑适用状态模式
结构图
代码示例
|
|
访问者模式
定义
访问者模式表示一个作用于某个对象结构中的个元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
适用场景
访问者模式的目的就是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易
结构图
代码示例
|
|
中介者模式
定义
中介者模式是指用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互
适用场景
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合
结构图
代码示例
|
|
解释器模式
定义
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
使用场景
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个
简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题